//权限拦截在路由跳转，路由守卫
import router from "@/router";
import store from "@/store";  //引入store实例，和组件中的this.$store是一回事
import NProgress from 'nprogress' // 引入一份进度条插件
import 'nprogress/nprogress.css' // 引入进度条样式
const whiteList = ['/login', '/404'] // 定义白名单  所有不受权限控制的页面



//next是前置守卫必须执行的钩子，如果不执行，页面就挂了
//next（）放过
//next（false） 跳转终止
//next（地址） 跳转到某个地址


//前置守卫
router.beforeEach(async function (to, from, next){
  NProgress.start() // 开启进度条
  //如果有token
if (store.getters.token){
  //判断是不是登录页
  if (to.path ==='/login'){

    next('/')

  }
  else {
    //获取登录用户的资料
    if (!store.getters.username){
      // 如果说后续 需要根据用户资料获取数据的话 这里必须改成 同步
      // 筛选用户的可用路由
      // actions中函数 默认是Promise对象 调用这个对象 想要获取返回的值话 必须 加 await或者是then
      // actions是做异步操作的
    const {menu}=await  store.dispatch('user/getloginUser')

      const routes =await store.dispatch('permission/filterRoutes',menu)
      await store.dispatch('permission/points',menu)



      // routes就是筛选得到的动态路由
      // 动态路由 添加到 路由表中 默认的路由表 只有静态路由 没有动态路由
      // addRoutes  必须 用 next(地址) 不能用next()
      router.addRoutes([...routes, { path: '*', redirect: '/404', hidden: true }]) // 添加动态路由到路由表  铺路


      // 添加完动态路由之后
      next(to.path) // 相当于跳到对应的地址  相当于多做一次跳转 为什么要多做一次跳转
      // 进门了，但是进门之后我要去的地方的路还没有铺好，直接走，掉坑里，多做一次跳转，再从门外往里进一次，跳转之前 把路铺好，再次进来的时候，路就铺好了

    }else {
      next()

    }

  }

}
//在没有token的情况下
else {

if (whiteList.indexOf(to.path) >-1){
// 如果找到了 表示在在名单里面
  next()
}else {
  next('/login') // 跳到登录页
}

}
  NProgress.done() // 手动强制关闭一次  为了解决 手动切换地址时  进度条的不关闭的问题

})
//后置守卫
router.afterEach(function (){
  NProgress.done() // 关闭进度条
})
